<?php
/*
 * Quark PHP Framework
 * Copyright 2011, Sahib Alejandro Jaramillo Leo.
 * http://quarkphp.com/
 * Licensed under the GNU General Public License (http://www.gnu.org/licenses/gpl.html).
 */
/**
 * Clase para trabajar con diferentes lenguajes.
 * @author sahib
 */
class Lang {

	/**
	 * Prefijo del lenguaje
	 * @access protected
	 * @var string
	 */
	protected static $lang;

	/**
	 * Prefijo del lenguaje por default
	 * @access protected
	 * @var string
	 */
	protected static $lang_def;

	/**
	 * Flag multilenguaje o no
	 * @access protected
	 * @var bool
	 */
	protected static $on_multi;

	/**
	 * Ruta del archivo de lenguaje
	 * @access protected
	 * @var string
	 */
	protected $file_path;

	/**
	 * Array de lenguajes cargados en memoria
	 * @access protected
	 * @var array
	 */
	protected $loaded_langs;

	/**
	 * Constructor
	 * @param string $file_path Ruta del archivo de lenguaje
	 * @param string $lang prefijo del lenguaje
	 * @return Lang
	 */
	public function __construct( $file_path = NULL, $lang = NULL ) {

		$this->file_path = ($file_path == NULL ? strtolower( Controller::getRunningControllerName( ) ) . '/' .
			 Controller::getRunningActionName( ) : $file_path);
			if( $lang != NULL )
				self::getLang( $lang );
		}

		/**
		 * Devuelve la lista de lenguajes definidos en el config
		 * @access public
		 * @return array lista de lenguajes
		 */
		public static function getLangs( ) {

			return Config::get( 'langs' );
		}

		/**
		 * Devuelve el prefijo del lenguaje por default
		 * @access public
		 * @return string prefijo
		 */
		public static function getLangDefault( ) {

			if( self::$lang_def == NULL )
				self::$lang_def = array_shift( Config::get( 'langs' ) );
			return self::$lang_def;
		}

		/**
		 * Devuelve TRUE si el sistma esta configurado para utilizar el prefijo del lenguaje
		 * en el subdominio, de lo contrario false.
		 * @access public
		 * @return bool
		 */
		public static function onSubdomain( ) {

			return Config::get( 'lang_subdomain' );
		}

		/**
		 * Devuelve TRUE si esta activado el modo multi lenguaje de lo contrario devuelve FALSE.
		 * @access public
		 * @return bool flag
		 */
		public static function onMultiLangMode( ) {

			if( self::$on_multi == NULL ) {
				$langs = Config::get( 'langs' );
				self::$on_multi = !empty( $langs );
			}
			return self::$on_multi;
		}

		/**
		 * Devuelve la cadena de texto que es representada por $key en el archivo de lenguaje especificado
		 * @param string $key tag
		 * @param string $force_lang prefijo del lenguaje forzado
		 * @return string texto
		 */
		public function get( $key, $force_lang = NULL ) {

			$the_lang = self::$lang;
			$file_path = $this->file_path;
			
			// Utilizar el file_path definido en el $key
			if( strpos( $key, '/' ) !== FALSE ) {
				$path_parts = explode( '/', $key );
				$key = array_pop( $path_parts );
				$file_path = implode( '/', $path_parts );
			}
			// Forzar a un lenguaje especifico
			elseif( $force_lang != NULL )
				$the_lang = $force_lang;
			
			$file_path .= '_' . $the_lang;
			
			// Cargar archivo de lenguaje si no estaba cargado.
			if( !isset( $this->loaded_langs[$file_path] ) ) {
				if( !is_file( 'lang/' . $file_path . '.php' ) )
					Quark::log( 'Falta archivo de idioma ' . $file_path . ' para ' . $key );
				else {
					$lang = array();
					require 'lang/' . $file_path . '.php';
					$this->loaded_langs[$file_path] = $lang;
				}
			}
			
			// Devolver texto o un marcador si no existe.
			return (isset( $this->loaded_langs[$file_path][$key] ) ? $this->loaded_langs[$file_path][$key] : '{' . $file_path .
				 '/' . $key . '}');
			}

			/**
			 * Establece la ruta del archivo de lenguaje
			 * @param string $file_path ruta del archivo de lenguaje, sin prefijo ni extension
			 * @return string la antigua ruta del archivo de lenguaje
			 */
			public function setFilePath( $file_path ) {

				$bak = $this->file_path;
				$this->file_path = $file_path;
				return $bak;
			}

			/**
			 * Establece el prefijo de lenguaje
			 * @param string $lang prefijo de lenguaje
			 * @return string antigui prefijo de lenguaje
			 */
			public static function setLang( $lang ) {

				$bak = self::$lang;
				self::$lang = $lang;
				return $bak;
			}

			/**
			 * Devuelve el prefijo del lenguaje en ejecucion
			 * @access public
			 * @return string prefijo
			 */
			public static function getLang( ) {

				return self::$lang;
			}
		}